(PYTHON) Day - 9 Sets(1)

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank


Sets


기본 개념

  • set 자료형은 크게 2가지 특징을 가진다
    • 정렬되지 않음(unordered collection of elements)
    • 중복 데이터가 없음(without duplicate entries)
  • ‘membership testing’이나 ‘eliminating duplicate entries’ 등에 사용된다

CREATING SETS


> > myset = {1, 2} # 값을 바로 선언하는 방법
> > myset = set() # set 자료형 초기화
> > myset = set(['a', 'b']) # list 를 set 자료형으로 변환
> > myset
> > {'a', 'b'}

MODIFYING SETS
add() 함수를 사용하는 방법과 update() 함수를 사용하는 방법이 있음


> > myset.add('c')
> > myset
> > {'a', 'c', 'b'}
> > myset.add('a') # 'a' 데이터가 이미 있음으로 변화가 없음
> > myset.add((5, 4))
> > myset
> > {'a', 'c', 'b', (5, 4)}

> > myset.update([1, 2, 3, 4]) # update() 는 iterable한 객체에만 작동함
> > myset
> > {'a', 1, 'c', 'b', 4, 2, (5, 4), 3}
> > myset.update({1, 7, 8})
> > myset
> > {'a', 1, 'c', 'b', 4, 7, 8, 2, (5, 4), 3}
> > myset.update({1, 6}, [5, 13])
> > myset
> > {'a', 1, 'c', 'b', 4, 5, 6, 7, 8, 2, (5, 4), 13, 3}

REMOVING ITEMS
discard() 함수와 remove() 함수가 있으며 하나의 인자(argument)를 전달받아 집합에서 제거함
해당 데이터가 없으면 discard() 는 아무것도 안하지만 remove() KeyError exception을 발생시킴


> > myset.discard(10)
> > myset
> > {'a', 1, 'c', 'b', 4, 5, 7, 8, 2, 12, (5, 4), 13, 11, 3}
> > myset.remove(13)
> > myset
> > {'a', 1, 'c', 'b', 4, 5, 7, 8, 2, 12, (5, 4), 11, 3}

pop() 함수는 임의의 값을 반환하고 삭제
clear() 함수는 집합에 있는 모든 값을 삭제


> > myset.pop()
> > myset
> > 1
> > myset.clear()
> > myset
> > set()

COMMON SET OPERATIONS
union(), intersection() 그리고 difference() 함수가 있음


> > a = {2, 4, 5, 9}
> > b = {2, 4, 11, 12}
> > a.union(b) # a와 b 집합의 합집합
> > {2, 4, 5, 9, 11, 12}
> > a.intersection(b) # a와 b 집합의 교집합
> > {2, 4}
> > a.difference(b) # a와 b 집합의 차집합
> > {9, 5}

Introduction to Sets


문제 : Ms. Gabriel Williams 의 온실에 있는 나무들의 평균키를 구하라
입력 : 총 나무의 수 N과 각 나무의 키를 입력 받는다
출력 : 나무들의 평균키

10
161 182 161 154 176 170 167 171 170 174

169.375

수행시간에 대한 최적화는 딱히 생각하지 않고 그냥 로직에 따라 구현

def average(array):
Sum_of_distinct_heights = sum(set(array))
Total_number_of_distict_heights = len(set(array))

return Sum_of_distinct_heights/Total_number_of_distict_heights

if **name** == '**main**':
n = int(input())
arr = list(map(int, input().split()))
result = average(arr)
print(result)

Symmetric Difference


문제 : 두 집합의 대칭차(symmetric difference)를 오름차순으로 출력해라
입력 : 원소 개수 M, M개의 원소들, 원소 개수 N, N개의 원소들 (4줄 입력)
출력 : 대칭차를 한줄씩 출력

4
2 4 5 9
4
2 4 11 12

5
9
11
12

대칭차를 구하는 함수 symmetric_difference() 를 사용


# Enter your code here. Read input from STDIN. Print output to STDOUT

if **name** == '**main**':
M = int(input())
set_m = {int(element) for element in input().split()}
N = int(input())
set_n = {int(element) for element in input().split()}

print(*sorted(set_m.symmetric_difference(set_n)), sep='\n')

사실 1, 3번째 줄의 입력은 무의미하다
두개의 집합을 한줄로 입력 받는 방법을 기억해두자

a,b = [set(input().split()) for \_ in range(4)][1::2]
print(\*sorted(a^b, key=int), sep='\n')